package com.merry.aop.advice;

import org.aopalliance.intercept.ConstructorInvocation;
import org.aopalliance.intercept.Interceptor;
import org.aopalliance.intercept.Joinpoint;

/**
 * 该接口是 Interceptor 的一个子接口，表示专门拦截构造器的。
 * 在new一个对象的时候进行拦截。 案例代码如下：
 *
 * <pre class=code>
 * class DebuggingInterceptor implements ConstructorInterceptor {
 *   Object instance=null;
 *
 *   Object construct(ConstructorInvocation i) throws Throwable {
 *     if(instance==null) {
 *       return instance=i.proceed();
 *     } else {
 *       throw new Exception("singleton does not allow multiple instance");
 *     }
 *   }
 * }
 * </pre>
 *
 * @author Rod Johnson
 */
public interface ConstructorInterceptor extends Interceptor {

    /**
     * 调用该方法，以生成实际的对象。他的入参 {@link ConstructorInvocation} 是 {@link Joinpoint} 的一个子接口，专门表示当前对象，是一个可以执行的构造器方法。
     * 通过 {@link Joinpoint#proceed()} 方法完成它的调用。
     */
    Object construct(ConstructorInvocation invocation) throws Throwable;

}
